/**
 * Copyright (c) 2013-2022 Nikita Koksharov
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.redisson.api;

import java.util.concurrent.TimeUnit;

import org.redisson.client.codec.Codec;

/**
 * 所有Redison对象的基本接口
 */
public interface RObject extends RObjectAsync {

    /**
     * 返回自上次对该对象执行写入或读取操作以来所花费的秒数。
     */
    Long getIdleTime();

    /**
     * 使用redis内存的大小
     */
    long sizeInMemory();

    /**
     * 返回 Redis 内存中对象使用的字节数。
     */
    void restore(byte[] state);

    /**
     * 使用方法返回的状态恢复对象dump()。
     */
    void restore(byte[] state, long timeToLive, TimeUnit timeUnit);


    /**
     * 使用给定的状态数组来恢复和替换当前的状态。
     * 该方法将当前对象的状态替换为参数中提供的状态数组所表示的状态。
     * 注意：此方法不返回任何值，而是直接修改对象的状态。
     *
     * @param state 一个包含对象状态信息的字节数组。该数组必须包含足够的信息来完全恢复对象的状态。
     */
    void restoreAndReplace(byte[] state);


    /**
     * 使用给定的状态信息恢复并替换当前状态，同时设置一个新的时间戳。
     * 这个方法允许在系统中引入一个新的状态，该状态可以基于之前保存的状态进行恢复，
     * 同时提供了一个时间戳，该时间戳可以用于控制这个状态的有效期。
     *
     * @param state      用于恢复和替换当前状态的字节数组。
     * @param timeToLive 指定状态的有效期，超过这个时间状态将不再有效。
     * @param timeUnit   指定时间戳的时间单位。
     */
    void restoreAndReplace(byte[] state, long timeToLive, TimeUnit timeUnit);

    /**
     * 返回对象的转储
     */
    byte[] dump();

    /**
     * 更新对象的最后访问时间。
     */
    boolean touch();

    /**
     * 将对象从源 Redis 实例复制到目标 Redis 实例
     */
    void migrate(String host, int port, int database, long timeout);

    /**
     * 将对象从源 Redis 实例复制到目标 Redis 实例
     */
    void copy(String host, int port, int database, long timeout);

    /**
     * 将对象移动到另一个数据库
     */
    boolean move(int database);

    /**
     * 返回对象的名称
     */
    String getName();

    /**
     * 删除对象
     */
    boolean delete();

    /**
     * 删除对象。实际删除将在稍后异步发生。
     */
    boolean unlink();

    /**
     * 将当前对象键重命名为newName
     */
    void rename(String newName);

    /**
     * newName 仅当新键不存在时才将当前对象键重命名为
     */
    boolean renamenx(String newName);

    /**
     * 检查对象是否存在
     */
    boolean isExists();

    /**
     * 返回此 RObject 使用的底层编解码器
     */
    Codec getCodec();

    /**
     * 添加对象事件监听器
     */
    int addListener(ObjectListener listener);

    /**
     * 删除对象事件监听器
     */
    void removeListener(int listenerId);

}
